package exercises.leetcode;

/**
 * <a href="https://leetcode-cn.com/problems/reverse-words-in-a-string-iii/">
 * 557. 反转字符串中的单词 III</a>
 *
 * <p><span color="#87CEEB">描述:</span>
 * <p>
 * 给定一个字符串，你需要反转字符串中每个单词的字符顺序，同时仍保留空格和单词的初始顺序。
 * <p>
 *  
 * <p>
 * 示例：
 * <p>
 * 输入："Let's take LeetCode contest"
 * 输出："s'teL ekat edoCteeL tsetnoc"
 *  
 * <p>
 * 提示：
 * <p>
 * 在字符串中，每个单词由单个空格分隔，并且字符串中不会有任何额外的空格。
 *
 * @author or2
 * @date 2021年09月22日 时间: 10:22
 */
public class No557 {
    public String reverseWords(String s) {
        char[] chars = s.toCharArray();
        int firstIndex = 0;
        for (int i = 0, lastIndex; i < chars.length; i++) {
            if (chars[i] != ' ') {
                continue;
            }

            lastIndex = i;
            reverseWord(chars, firstIndex, lastIndex);
            firstIndex = lastIndex + 1;
        }
        reverseWord(chars, firstIndex, chars.length);

        return new String(chars);
    }

    /**
     * 交换 字符数组中 某段字符的顺序 -> 逆序
     * @param chars 原字符数组
     * @param firstIndex 逆序的开始下标
     * @param lastIndex 逆序的结束下标 + 1
     */
    private void reverseWord(char[] chars, int firstIndex, int lastIndex) {
        for (int i = 0; i < lastIndex - firstIndex >> 1; i++) {
            char temp = chars[i + firstIndex];
            chars[i + firstIndex] = chars[lastIndex - 1 - i];
            chars[lastIndex - 1 - i] = temp;
        }
    }
}
